/**
 * @description 事件
 * @author 张航
 * @date 2020-03-18 12:46:50
 * @version V1.0.0
 */

/**
 * @functionName  on
 * @return {Function} on(element, event, handler)
 * @description 绑定事件
 * @author 张航
 * @date 2020-03-18 12:50:08
 * @version V1.0.0
 */
export const on = (function () {
  if (document.addEventListener) {
    return function (element, event, handler) {
      if (element && event && handler) {
        element.addEventListener(event, handler, false)
      }
    }
  } else {
    return function (element, event, handler) {
      if (element && event && handler) {
        element.attachEvent('on' + event, handler)
      }
    }
  }
})()

/**
 * @functionName off
 * @return {Function} off(element, event, handler)
 * @description 解绑事件
 * @author 张航
 * @date 2020-03-18 12:49:27
 * @version V1.0.0
 */
export const off = (function () {
  if (document.removeEventListener) {
    return function (element, event, handler) {
      if (element && event) {
        element.removeEventListener(event, handler, false)
      }
    }
  } else {
    return function (element, event, handler) {
      if (element && event) {
        element.detachEvent('on' + event, handler)
      }
    }
  }
})()

/**
 * @functionName throttle
 * @param {Function} fn 需要节流的函数
 * @param {Number} wait 节流的时间,毫秒
 * @return {Function} 返回执行的函数
 * @description 节流
 * @author 张航
 * @date 2020-04-13 11:39:25
 * @version V1.0.0
 */
export const throttle = function (fn = function () { }, wait = 1000) {
  // 维护一个 last
  let last = 0

  return function () {
    // 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量
    const context = this
    const args = arguments

    // 记录本次触发回调的时间
    const now = +new Date()

    // 判断上次触发的时间和本次触发的时间差是否小于时间间隔的阈值
    if (now - last >= wait) {
      // 如果时间间隔大于我们设定的时间间隔阈值，则执行回调
      last = now
      fn.apply(context, args)
    }
  }
}

/**
 * @functionName debounce
 * @param {Function} fn 需要防抖的函数
 * @param {Number} delay 防抖的时间,毫秒
 * @return {Function} 返回执行的函数
 * @description 防抖
 * @author 张航
 * @date 2019-12-30 10:23:59
 * @version V1.0.0
 */
export const debounce = function (fn = function () { }, delay = 1000) {
  // 维护一个 timer
  let timer = null

  return function () {
    // 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量
    const context = this
    const args = arguments

    clearTimeout(timer)
    timer = setTimeout(function () {
      fn.apply(context, args)
    }, delay)
  }
}

/**
 * @functionName resultObj
 * @param {Object} parameters 验证传入参数
 * @param {Boolean} result 验证结果
 * @param {String} message 验证结果说明
 * @return {Object} 返回包装对象
 * @description 包装验证结果对象
 * @author 张航
 * @date 2020-04-14 09:46:26
 * @version V1.0.0
 */
export const resultObj = (parameters = {}, result = false, message = '') => {
  return {
    parameters,
    result,
    message
  }
}
